package uba.algo3.tp3.tsp;

import static org.junit.Assert.assertEquals;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.junit.Test;

public class ConstructivaTest
{
	   static Grafo g;
	   
	   @Test
	   public void ConstructivaTest() throws IOException{
		   	  int i = 0;
			  
			  BufferedReader is = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3.in" ) ) );
		      BufferedWriter os = new BufferedWriter( new FileWriter( "Tp3Constructiva.out" ) );
		  	  //BufferedWriter os = new BufferedWriter( new FileWriter( getClass().getResource( "" ).getPath() + "Tp3Constructiva.out" ) ); //me tira FileNotFoundException!
		  	  
		      String line;

		      line = is.readLine();
		      
		      while(line != null)
		      {
		    	  leer(line,is);
			      
		    	  Constructiva c = new Constructiva(g);
			      Solucion s = c.get2TSP();
			      
			      escribir(s,os);

			      System.out.println("Costo Instancia " + (i+1) + ": " + s.getCosto());
	
			      line = is.readLine(); //paso a la siguiente instancia
			      i++;
		      }
		      
			  os.close();
			  
	   }
	   
		  public void leer(String line, BufferedReader is) throws IOException{
				  
				  StringTokenizer st1 = new StringTokenizer(line, " ");
				  String cantNodos = st1.nextToken();
				  String nodoOrig_str = st1.nextToken();
					  
			      int n = Integer.parseInt(cantNodos);
				  int nodoOrig = Integer.parseInt(nodoOrig_str);
				  g = new Grafo(n, nodoOrig);
				  int temp;
				  
				  for(int i = 0; i < n-1; i++)
				  {
					  line = is.readLine();
					  st1 = new StringTokenizer(line, " ");
				      int j = i+1;
					  int k = 0;
					  while(st1.hasMoreTokens())
					  {
						  String s = st1.nextToken();
						  temp = Integer.parseInt(s);
						  g.matriz[k][j] = temp;
						  g.matriz[j][k] = temp;
						  k++;
					  }
				  }
		  }
			  
		  public void escribir(Solucion s, BufferedWriter os) throws IOException{
			      //escribo el archivo de salida
			      ArrayList<Integer> ciclo1 = s.getCiclo1();
			      String solCiclo1 = formatearSalida(ciclo1);
			      ArrayList<Integer> ciclo2 = s.getCiclo2();
			      String solCiclo2 = formatearSalida(ciclo2);
			      
			      os.append(solCiclo1);
			      os.newLine();
			      os.append(solCiclo2);
			      os.newLine();
		  }

	   private String formatearSalida(ArrayList<Integer> a){
			String res = new String();
			a.remove(0); //le saco el nodo de origen
			for(Integer e : a){
				res+=e;
				res+=" ";
			}
			return res;	
	   }		
	
/*	   @Test
	   public void fileWritingRunTest() throws IOException {
	      // Con este test se lee el archivo de entrada proporcioando por la catedra 
	      // y se genera la salida.
	      
	      BufferedReader is = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3ConstructivaNoOptima.in" ) ) );
	  	  BufferedWriter os = new BufferedWriter( new FileWriter( "Tp3ConstructivaNoOptima.out" ) );

	      String line;
	      
	      
	      line = is.readLine();
	      
	      while(line != null)
	      {
			  StringTokenizer st1 = new StringTokenizer(line, " ");
			  String cantNodos = st1.nextToken();
			  String nodoOrig_str = st1.nextToken();
			  
			  int n = Integer.parseInt(cantNodos);
			  int nodoOrig = Integer.parseInt(nodoOrig_str);
			  g = new Grafo(n, nodoOrig);
			  int temp;
			  for(int i = 0; i < n-1; i++)
			  {
				  line = is.readLine();
				  
				  st1 = new StringTokenizer(line, " ");
				  int j = i+1;
				  int k = 0;
				  while(st1.hasMoreTokens())
				  {
					  String s = st1.nextToken();
					  temp = Integer.parseInt(s);
					  g.matriz[k][j] = temp;
					  g.matriz[j][k] = temp;
					  k++;
				  }
			  }
			  
		      Constructiva c = new Constructiva(g);
		      
		      Solucion s = c.get2TSP();
		      
		      //escribo el archivo de salida
		      ArrayList<Integer> ciclo1 = s.getCiclo1();
		      String solCiclo1 = formatearSalida(ciclo1);
		      ArrayList<Integer> ciclo2 = s.getCiclo2();
		      String solCiclo2 = formatearSalida(ciclo2);
		      
		      os.append(solCiclo1);
		      os.newLine();
		      os.append(solCiclo2);
		      os.newLine();
			  
			  line = is.readLine();
	      }
	      
	      os.close();
	      
	   }
*/	   
	
}
